package fun.pengzh.sssdnsy.controller;

import fun.pengzh.sssdnsy.config.DemoConf;
import fun.sssdnsy.client.ConfClient;
import fun.sssdnsy.client.listener.ConfListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;

/**
 * @Desc
 * @Author pengzh
 * @Since 2023-03-31
 */
@Controller
public class DemoController {

    private static Logger logger = LoggerFactory.getLogger(DemoController.class);

    static {
        /**
         * 配置变更监听示例：可开发Listener逻辑，监听配置变更事件；可据此实现动态刷新JDBC连接池等高级功能；
         */
        ConfClient.addListener("default.key01", new ConfListener() {
            @Override
            public void onChange(String key, String value) throws Exception {
                logger.info("配置变更事件通知：{}={}", key, value);
            }
        });
    }

    @Resource
    private DemoConf demoConf;

    @RequestMapping("")
    @ResponseBody
    public String index() {

        StringBuilder builder = new StringBuilder();

        /**
         * 方式1: API方式
         *
         * 		- 参考 "IndexController" 中 "XxlConfClient.get("key", null)" 即可；
         * 		- 用法：代码中直接调用API即可，示例代码 ""XxlConfClient.get("key", null)"";
         * 		- 优点：
         * 			- 配置从配置中心自动加载；
         * 			- 存在LocalCache，不用担心性能问题；；
         * 			- 支持动态推送更新；
         * 			- 支持多数据类型；
         */
        builder.append("</br></br>");
        String paramByApi = ConfClient.get("default.key01", null);
        builder.append("1、API方式: ");
        builder.append("</br>");
        builder.append("default.key01= ");
        builder.append(paramByApi);

        /**
         * 方式2: @XxlConf 注解方式
         *
         * 		- 参考 "DemoConf.paramByAnno" 属性配置；示例代码 "@XxlConf("key") public String paramByAnno;"；
         * 		- 用法：对象Field上加注解 ""@XxlConf("default.key02")"，支持设置默认值，支持设置是否开启动态刷新；
         * 		- 优点：
         * 			- 配置从配置中心自动加载；
         * 			- 存在LocalCache，不用担心性能问题；
         * 			- 支持动态推送更新；
         * 			- 支持设置配置默认值；
         */
        builder.append("</br></br>");
        builder.append("2、@XxlConf 注解方式:");
        builder.append("</br>");
        builder.append("default.key02= ");
        builder.append(demoConf.key02);
        /**
         * 方式3: XML占位符方式
         *
         * 		- 参考 "applicationcontext-xxl-conf.xml" 中 "DemoConf.paramByXml" 属性配置；示例代码 "<property name="paramByXml" value="$XxlConf{key}" />"；
         * 		- 用法：占位符方式 "$XxlConf{key}"；
         * 		- 优点：
         * 			- 配置从配置中心自动加载；
         * 			- 存在LocalCache，不用担心性能问题；
         *
         */
        builder.append("</br></br>");
        builder.append("3、XML占位符方式:");
        builder.append("</br>");
        builder.append("default.key03= ");
        builder.append(demoConf.key03);

        /**
         * 类型测试
         */
        builder.append("</br></br>");
        builder.append("3、number 数字:");
        builder.append("</br>");
        builder.append("test.number= ");
        builder.append(demoConf.number);

        builder.append("</br></br>");
        builder.append("3、date 日期 :");
        builder.append("</br>");
        builder.append("test.date= ");
        builder.append(demoConf.date);

        return builder.toString();
    }
}
